package com.ontheroad.core.util;

import java.util.HashMap;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttTopic;

import com.alibaba.fastjson.JSONObject;
import com.ontheroad.user.model.UserDto;
import com.ontheroad.user.service.UserTopicService;
import com.ontheroad.utils.JsonUtils;

/**
 * 发布消息的回调类
 * 
 * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。
 * 每个客户机标识都需要一个回调实例。在此示例中，构造函数传递客户机标识以另存为实例数据。 在回调中，将它用来标识已经启动了该回调的哪个实例。
 * 必须在回调类中实现三个方法：
 * 
 * public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。
 * 
 * public void connectionLost(Throwable cause)在断开连接时调用。
 * 
 * public void deliveryComplete(MqttDeliveryToken token)) 接收到已经发布的 QoS 1 或 QoS 2
 * 消息的传递令牌时调用。 由 MqttClient.connect 激活此回调。
 * 
 */
public class PushCallback2 implements MqttCallback {
	
	public void connectionLost(Throwable cause) {
		// 连接丢失后，一般在这里面进行重连
		System.out.println("连接断开，可以做重连");
	}

	public void deliveryComplete(IMqttDeliveryToken token) {
		System.out.println("deliveryComplete---------" + token.isComplete());
	}

	public void messageArrived(String topic, MqttMessage message)
			throws Exception {
		try {
			// subscribe后得到的消息会执行到这里面
			System.out.println("接收消息主题 : " + topic);
			System.out.println("接收消息Qos : " + message.getQos());
			String a =new String(message.getPayload());
			System.out.println("接收消息内容 : " +a );
			System.out.println(a);
			if("topic11".equals(topic)&&!"close".equals(a)){
				UserTopicService userTopicService =(UserTopicService)ApplicationContextHelper.getBean("userTopicService");
				UserDto user=(UserDto) JsonUtils.jsonToObject(a, UserDto.class);
				HashMap<String, Object> map =userTopicService.regist(user);
				
				ServerMQTT server = new ServerMQTT();
				server.message = new MqttMessage();
				server.message.setQos(2);
				server.message.setRetained(true);
				server.message.setPayload(JSONObject.toJSONString(map).getBytes());
				
				MqttTopic topic12 = server.client.getTopic("topic12");
				
				server.publish(topic12 , server.message);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}